🌎 rns.kin.earth git 🌍
RNS/Destination.py 4ffe4482d378bb75096e65fdbdbb4e3fe7e2b0e4 (4ffe4482) Text, 7.18 KB
Tff7b72import T7ee787base64
Tff7b72import T7ee787math
Tff7b72import T7ee787RNS
Tff7b72from T7ee787cryptographyT7ee787.T7ee787fernet Tff7b72import Te6edf3Fernet
Tff7b72from T7ee787cryptographyT7ee787.T7ee787hazmatT7ee787.T7ee787primitives Tff7b72import Te6edf3hashes
Tff7b72from T7ee787cryptographyT7ee787.T7ee787hazmatT7ee787.T7ee787backends Tff7b72import Te6edf3default_backend
Tff7b72from T7ee787cryptographyT7ee787.T7ee787hazmatT7ee787.T7ee787primitives Tff7b72import Te6edf3serialization
Tff7b72from T7ee787cryptographyT7ee787.T7ee787hazmatT7ee787.T7ee787primitivesT7ee787.T7ee787asymmetric Tff7b72import Te6edf3rsa
Tff7b72from T7ee787cryptographyT7ee787.T7ee787hazmatT7ee787.T7ee787primitivesT7ee787.T7ee787asymmetric Tff7b72import Te6edf3padding
Tff7b72class T56d364CallbacksTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflink_established Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpacket Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffproof_requested Tff7b72= Tff7b72None
Tff7b72class T56d364DestinationTb4b4b4:
Te6edf3KEYSIZE Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffKEYSIZETb4b4b4;
Te6edf3PADDINGSIZETff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffPADDINGSIZETb4b4b4;
T8b949e# Constants
Te6edf3SINGLE Tff7b72= T79c0ff0x00
Te6edf3GROUP Tff7b72= T79c0ff0x01
Te6edf3PLAIN Tff7b72= T79c0ff0x02
Te6edf3LINK Tff7b72= T79c0ff0x03
Te6edf3types Tff7b72= Tb4b4b4[Te6edf3SINGLETb4b4b4, Te6edf3GROUPTb4b4b4, Te6edf3PLAINTb4b4b4, Te6edf3LINKTb4b4b4]
Te6edf3PROVE_NONE Tff7b72= T79c0ff0x21
Te6edf3PROVE_APP Tff7b72= T79c0ff0x22
Te6edf3PROVE_ALL Tff7b72= T79c0ff0x23
Te6edf3proof_strategies Tff7b72= Tb4b4b4[Te6edf3PROVE_NONETb4b4b4, Te6edf3PROVE_APPTb4b4b4, Te6edf3PROVE_ALLTb4b4b4]
Te6edf3IN Tff7b72= T79c0ff0x11Tb4b4b4;
Te6edf3OUT Tff7b72= T79c0ff0x12Tb4b4b4;
Te6edf3directions Tff7b72= Tb4b4b4[Te6edf3INTb4b4b4, Te6edf3OUTTb4b4b4]
Tf0883e@staticmethod
Tff7b72def Td2a8ffgetDestinationNameTb4b4b4(Te6edf3app_nameTb4b4b4, Tff7b72*Te6edf3aspectsTb4b4b4)Tb4b4b4:
T8b949e# Check input values and build name string
Tff7b72if Ta5d6ff"Ta5d6ff.Ta5d6ff" Tff7b72in Te6edf3app_nameTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDots canTa5d6ff'Ta5d6fft be used in app namesTa5d6ff"Tb4b4b4)
Te6edf3name Tff7b72= Te6edf3app_name
Tff7b72for Te6edf3aspect Tff7b72in Te6edf3aspectsTb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ff.Ta5d6ff" Tff7b72in Te6edf3aspectTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDots canTa5d6ff'Ta5d6fft be used in aspectsTa5d6ff"Tb4b4b4)
Te6edf3name Tff7b72= Te6edf3name Tff7b72+ Ta5d6ff"Ta5d6ff.Ta5d6ff" Tff7b72+ Te6edf3aspect
Tff7b72return Te6edf3name
Tf0883e@staticmethod
Tff7b72def Td2a8ffgetDestinationHashTb4b4b4(Te6edf3app_nameTb4b4b4, Tff7b72*Te6edf3aspectsTb4b4b4)Tb4b4b4:
Te6edf3name Tff7b72= Te6edf3DestinationTff7b72.Td2a8ffgetDestinationNameTb4b4b4(Te6edf3app_nameTb4b4b4, Tff7b72*Te6edf3aspectsTb4b4b4)
T8b949e# Create a digest for the destination
Te6edf3digest Tff7b72= Te6edf3hashesTff7b72.Td2a8ffHashTb4b4b4(Te6edf3hashesTff7b72.Td2a8ffSHA256Tb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3backendTff7b72=Te6edf3default_backendTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3digestTff7b72.Td2a8ffupdateTb4b4b4(Te6edf3nameTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffUTF-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3digestTff7b72.Td2a8fffinalizeTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff10Tb4b4b4]
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identityTb4b4b4, Te6edf3directionTb4b4b4, Tffa657typeTb4b4b4, Te6edf3app_nameTb4b4b4, Tff7b72*Te6edf3aspectsTb4b4b4)Tb4b4b4:
T8b949e# Check input values and build name string
Tff7b72if Ta5d6ff"Ta5d6ff.Ta5d6ff" Tff7b72in Te6edf3app_nameTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDots canTa5d6ff'Ta5d6fft be used in app namesTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657type Tff7b72in Te6edf3DestinationTff7b72.Td2a8fftypesTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffUnknown destination typeTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3direction Tff7b72in Te6edf3DestinationTff7b72.Td2a8ffdirectionsTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffUnknown destination directionTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcallbacks Tff7b72= Te6edf3CallbacksTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftype Tff7b72= Tffa657type
Tff7b72selfTff7b72.Td2a8ffdirection Tff7b72= Te6edf3direction
Tff7b72selfTff7b72.Td2a8ffproof_strategy Tff7b72= Te6edf3DestinationTff7b72.Td2a8ffPROVE_NONE
Tff7b72selfTff7b72.Td2a8ffmtu Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8fflinks Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3identity Tff7b72!= Tff7b72None Tff7b72and Tffa657type Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Te6edf3aspects Tff7b72= Te6edf3aspectsTff7b72+Tb4b4b4(Te6edf3identityTff7b72.Td2a8ffhexhashTb4b4b4,Tb4b4b4)
Tff7b72if Te6edf3identity Tff7b72== Tff7b72None Tff7b72and Te6edf3direction Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffIN Tff7b72and Tff7b72selfTff7b72.Td2a8fftype Tff7b72!= Te6edf3DestinationTff7b72.Td2a8ffPLAINTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3aspects Tff7b72= Te6edf3aspectsTff7b72+Tb4b4b4(Te6edf3identityTff7b72.Td2a8ffhexhashTb4b4b4,Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3identity
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Te6edf3DestinationTff7b72.Td2a8ffgetDestinationNameTb4b4b4(Te6edf3app_nameTb4b4b4, Tff7b72*Te6edf3aspectsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhash Tff7b72= Te6edf3DestinationTff7b72.Td2a8ffgetDestinationHashTb4b4b4(Te6edf3app_nameTb4b4b4, Tff7b72*Te6edf3aspectsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhexhash Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffproofcallback Tff7b72= Tff7b72None
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffregisterDestinationTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff<Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffnameTff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffhexhashTff7b72+Ta5d6ff"Ta5d6ff>Ta5d6ff"
Tff7b72def Td2a8fflink_established_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallbacksTff7b72.Td2a8fflink_established Tff7b72= Te6edf3callback
Tff7b72def Td2a8ffpacket_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallbacksTff7b72.Td2a8ffpacket Tff7b72= Te6edf3callback
Tff7b72def Td2a8ffproof_requested_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallbacksTff7b72.Td2a8ffproof_requested Tff7b72= Te6edf3callback
Tff7b72def Td2a8ffset_proof_strategyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3proof_strategyTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3proof_strategy Tff7b72in Te6edf3DestinationTff7b72.Td2a8ffproof_strategiesTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffUnsupported proof strategyTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffproof_strategy Tff7b72= Te6edf3proof_strategy
Tff7b72def Td2a8ffreceiveTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3packetTb4b4b4)Tb4b4b4:
Te6edf3plaintext Tff7b72= Tff7b72selfTff7b72.Td2a8ffdecryptTb4b4b4(Te6edf3packetTff7b72.Td2a8ffdataTb4b4b4)
Tff7b72if Te6edf3plaintext Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffLINKREQUESTTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffincomingLinkRequestTb4b4b4(Te6edf3plaintextTb4b4b4, Te6edf3packetTb4b4b4)
Tff7b72if Te6edf3packetTff7b72.Td2a8ffpacket_type Tff7b72== Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffDATATb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcallbacksTff7b72.Td2a8ffpacket Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallbacksTff7b72.Td2a8ffpacketTb4b4b4(Te6edf3plaintextTb4b4b4, Te6edf3packetTb4b4b4)
Tff7b72def Td2a8ffincomingLinkRequestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3packetTb4b4b4)Tb4b4b4:
Te6edf3link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffvalidateRequestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3packetTb4b4b4)
Tff7b72if Te6edf3link Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflinksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3linkTb4b4b4)
Tff7b72def Td2a8ffcreateKeysTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffPLAINTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffA plain destination does not hold any keysTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffA single destination holds keys through an Identity instanceTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffGROUPTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprv_bytes Tff7b72= Te6edf3FernetTff7b72.Td2a8ffgenerate_keyTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprv Tff7b72= Te6edf3FernetTb4b4b4(Tff7b72selfTff7b72.Td2a8ffprv_bytesTb4b4b4)
Tff7b72def Td2a8ffgetPrivateKeyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffPLAINTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffA plain destination does not hold any keysTa5d6ff"Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffA single destination holds keys through an Identity instanceTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffprv_bytes
Tff7b72def Td2a8ffloadPrivateKeyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffPLAINTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffA plain destination does not hold any keysTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffA single destination holds keys through an Identity instanceTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffGROUPTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprv_bytes Tff7b72= Te6edf3key
Tff7b72selfTff7b72.Td2a8ffprv Tff7b72= Te6edf3FernetTb4b4b4(Tff7b72selfTff7b72.Td2a8ffprv_bytesTb4b4b4)
Tff7b72def Td2a8ffloadPublicKeyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72!= Te6edf3DestinationTff7b72.Td2a8ffSINGLETb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffOnly the Tffea00\"Ta5d6ffsingleTffea00\"Ta5d6ff destination type can hold a public keyTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffA single destination holds keys through an Identity instanceTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffencryptTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3plaintextTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffPLAINTb4b4b4:
Tff7b72return Te6edf3plaintext
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffSINGLE Tff7b72and Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffencryptTb4b4b4(Te6edf3plaintextTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffGROUPTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffprvTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffprv Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72return Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64decodeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffprvTff7b72.Td2a8ffencryptTb4b4b4(Te6edf3plaintextTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe GROUP destination could not encrypt dataTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo private key held by GROUP destination. Did you create or load one?Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffdecryptTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ciphertextTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffPLAINTb4b4b4:
Tff7b72return Te6edf3ciphertext
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffSINGLE Tff7b72and Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffdecryptTb4b4b4(Te6edf3ciphertextTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffGROUPTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffprvTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffprv Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffprvTff7b72.Td2a8ffdecryptTb4b4b4(Te6edf3base64Tff7b72.Td2a8ffurlsafe_b64encodeTb4b4b4(Te6edf3ciphertextTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe GROUP destination could not decrypt dataTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo private key held by GROUP destination. Did you create or load one?Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffsignTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3messageTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3DestinationTff7b72.Td2a8ffSINGLE Tff7b72and Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffsignTb4b4b4(Te6edf3messageTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None
T8b949e# Creates an announce packet for this destination.
T8b949e# Application specific data can be added to the announce.
Tff7b72def Td2a8ffannounceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3app_dataTff7b72=Tff7b72NoneTb4b4b4, Te6edf3path_responseTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3destination_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffhash
Te6edf3random_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffgetRandomHashTb4b4b4(Tb4b4b4)
Te6edf3signed_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashTff7b72+Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffgetPublicKeyTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3random_hash
Tff7b72if Te6edf3app_data Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3signed_data Tff7b72+Tff7b72= Te6edf3app_data
Te6edf3signature Tff7b72= Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffsignTb4b4b4(Te6edf3signed_dataTb4b4b4)
T8b949e# TODO: Check if this could be optimised by only
T8b949e# carrying the hash in the destination field, not
T8b949e# also redundantly inside the signed blob as here
Te6edf3announce_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashTff7b72+Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffgetPublicKeyTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3random_hashTff7b72+Te6edf3signature
Tff7b72if Te6edf3app_data Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3announce_data Tff7b72+Tff7b72= Te6edf3app_data
Tff7b72if Te6edf3path_responseTb4b4b4:
Te6edf3announce_context Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPATH_RESPONSE
Tff7b72elseTb4b4b4:
Te6edf3announce_context Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffNONE
Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3announce_dataTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffANNOUNCETb4b4b4, Te6edf3context Tff7b72= Te6edf3announce_contextTb4b4b4)Tff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Served by rngit 1.5.2 - Generated in 0.07s